
package com.ctbu.score.controller;

import com.ctbu.score.domain.*;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ctbu.score.domain.*;
import com.ctbu.score.service.ClassService;
import com.ctbu.score.service.ScoreService;
import com.ctbu.score.service.StudentService;
import com.ctbu.score.service.TeacherService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.util.*;

/**
 * @ClassName TeacherController
 * @Description 控制教师相关操作
 **/
@Controller
public class TeacherController {
    @Autowired
    private TeacherService teacherService;

    @Autowired
    private ScoreService scoreService;

    @Autowired
    private ClassService classService;

    @Autowired
    private StudentService studentService;

    /**
     * @Description 处理教师登录请求。
     * @param username 用户名
     * @param password 密码
     * @param map 存储返回信息的 Map
     * @param session HttpSession 对象
     * @return 登录成功重定向到教师主页，失败返回登录页面
     **/
    @PostMapping(value = "/tea/login")
    public String login(@RequestParam("username") String username,
                        @RequestParam("password") String password, Map<String,Object> map, HttpSession session)
    {
        Teacher tea = teacherService.login(username, password);
        if (tea != null) {
            session.setAttribute("loginUser", username);
            return "redirect:/teamain.html";
        } else {
            map.put("msg", "用户名或密码错误");
            return "login";
        }
    }

    /**
     * @Description 返回教师主页。
     * @return 重定向到教师主页
     **/
    @GetMapping(value = "/tea/toindex")
    public String teaToIndex() {
        return "redirect:/teamain.html";
    }

    /**
     * @Description 返回教师信息修改页面。
     * @param httpSession HttpSession 对象
     * @param model Model 对象
     * @return 教师信息修改页面
     **/
    @GetMapping(value = "/tea/toUpdateMsgPage")
    public String teaToUpdateMsgPage(HttpSession httpSession, Model model) {
        Teacher tea = teacherService.selectById((String) httpSession.getAttribute("loginUser"));
        model.addAttribute("tea", tea);
        return "tea/updatetea";
    }

    /**
     * @Description 处理教师信息更新请求。
     * @param teacher 需要更新的 Teacher 对象
     * @param bindingResult 绑定结果
     * @param model Model 对象
     * @param httpSession HttpSession 对象
     * @return 更新成功重定向到成功页面，失败返回教师信息修改页面
     **/
    @PutMapping(value = "/tea/updateTeaMsg")
    public String updateTeaMsg(@Valid Teacher teacher, BindingResult bindingResult, Model model, HttpSession httpSession) {
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<MyError> errmsg = new ArrayList<>();
        if (allErrors.size() == 0) {
            Teacher teacherInit = teacherService.selectById((String) httpSession.getAttribute("loginUser"));
            teacher.setTeaId(teacherInit.getTeaId());
            teacher.setTeaName(teacherInit.getTeaName());
            teacher.setTeaSex(teacherInit.getTeaSex());
            // 如果密码为空，设置为原有密码
            if (teacher.getTeaPass() == null || teacher.getTeaPass().isEmpty()) {
                teacher.setTeaPass(teacherInit.getTeaPass());
            }

            teacherService.deleTea(teacherInit.getTeaId());
            teacherService.addTeacherHavePass(teacher);
            return "redirect:/updateTeaSucc.html";
        } else {
            for (ObjectError error : allErrors) {
                errmsg.add(new MyError(error.getDefaultMessage()));
            }
            model.addAttribute("errors", errmsg);
            model.addAttribute("tea", teacher);
            return "tea/updatetea";
        }
    }

    /**
     * @Description 返回成绩管理首页。
     * @param pn 页码
     * @param model Model 对象
     * @return 成绩管理页面
     **/
    @GetMapping(value = "/tea/toteadmin/{pn}")
    public String toteadmin(@PathVariable("pn") Integer pn, Model model) {
        // 设置分页参数
        PageHelper.startPage(pn, 6);

        // 获取所有结果
        List<Score> scores = scoreService.getAllScores();

        // 包装分页信息
        PageInfo<Score> page = new PageInfo<>(scores, 5);

        // 获取所有班级
        List<Classes> classes = classService.getAllClass();

        // 添加属性到模型
        model.addAttribute("classes", classes);
        model.addAttribute("pageInfo", page);

        // 返回视图名称
        return "tea/tearesultlist";
    }

    /**
     * @Description 返回成绩添加页面。
     * @return 成绩添加页面
     **/
    @GetMapping(value = "/tea/resadd")
    public String toResAddPage() {
        return "tea/addResult";
    }

    /**
     * @Description 处理成绩添加事务。
     * @param score 需要添加的成绩 Resultss 对象
     * @param bindingResult 绑定结果
     * @param model Model 对象
     * @return 添加成功重定向到成绩管理首页，失败返回成绩添加页面
     **/
    @PostMapping(value = "/tea/resAdd")
    public String resAdd(@Valid Score score, BindingResult bindingResult, Model model) {
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<MyError> errmsg = new ArrayList<>();
        Score scoreVail = null;
        if (allErrors.size() == 0) {
            if (studentService.selectById(score.getStuId()) != null) {
                scoreVail = scoreService.selectScoreByStuIdAndSubName(score.getStuId(), score.getSubName());
                if (scoreVail == null) {
                    scoreService.addScore(score);
                    return "redirect:/tea/toteadmin/1";
                } else {
                    errmsg.add(new MyError("已存在该学生的此成绩信息"));
                    model.addAttribute("errors", errmsg);
                    model.addAttribute("res", score);
                    return "tea/addResult";
                }
            } else {
                errmsg.add(new MyError("不存在该学号的学生"));
                model.addAttribute("errors", errmsg);
                model.addAttribute("res", score);
                return "tea/addResult";
            }
        } else {
            for (ObjectError error : allErrors) {
                errmsg.add(new MyError(error.getDefaultMessage()));
            }
            model.addAttribute("errors", errmsg);
            model.addAttribute("res", score);
            return "tea/addResult";
        }
    }

    /**
     * @Description 返回成绩修改页面。
     * @param resId 成绩 ID
     * @param model Model 对象
     * @return 成绩修改页面
     **/
    @GetMapping(value = "/tea/res/{resId}")
    public String updateResPage(@PathVariable("resId") int resId, Model model) {
        Score score = scoreService.selectScoreByScoId(resId);
        model.addAttribute("res", score);
        model.addAttribute("resId", resId);
        return "tea/updateResult";
    }

    /**
     * @Description 更新成绩信息操作。
     * @param score 需要更新的成绩 Resultss 对象
     * @param bindingResult 绑定结果
     * @param model Model 对象
     * @return 更新成功重定向到成绩管理首页，失败返回成绩修改页面
     **/
    @PutMapping(value = "/tea/res")
    public String updateRes(@Valid Score score, BindingResult bindingResult, Model model) {
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<MyError> errmsg = new ArrayList<>();
        if (allErrors.size() == 0) {
            scoreService.deleteScoreById(score.getScoId());
            scoreService.addScore(score);
            return "redirect:/tea/toteadmin/1";
        } else {
            for (ObjectError error : allErrors) {
                errmsg.add(new MyError(error.getDefaultMessage()));
            }
            model.addAttribute("errors", errmsg);
            model.addAttribute("res", score);
            return "tea/updateResult";
        }
    }

    /**
     * @Description 处理删除成绩信息事务。
     * @param stuId 学生 ID
     * @return 重定向到成绩管理首页
     **/
    @DeleteMapping(value = "/tea/res/{resId}")
    public String deleres(@PathVariable("resId") int stuId) {
        scoreService.deleteScoreById(stuId);
        return "redirect:/tea/toteadmin/1";
    }

    /**
     * @Description 根据学生 ID 查询成绩。
     * @param pn 页码
     * @param stuId 学生 ID
     * @param model Model 对象
     * @return 根据学生 ID 查询成绩的页面
     **/
    @GetMapping(value = "/tea/selectById/{pn}")
    public String selectResultByStuId(@PathVariable("pn") Integer pn, @Param("stuId") String stuId, Model model) {
        PageHelper.startPage(pn, 6);
        List<Score> scores = scoreService.selectByStuId(stuId);
        PageInfo<Score> page = new PageInfo<>(scores, 5);
        List<Classes> classes = classService.getAllClass();
        model.addAttribute("classes", classes);
        model.addAttribute("pageInfo", page);
        model.addAttribute("stuId", stuId);
        return "tea/tearesultlistbystuid";
    }

    /**
     * @Description 返回成绩修改页面（根据学生 ID 查询）。
     * @param resId 成绩 ID
     * @param model Model 对象
     * @return 成绩修改页面
     **/
    @GetMapping(value = "/tea/resbyid/{resId}")
    public String updateResPageById(@PathVariable("resId") int resId, Model model) {
        Score score = scoreService.selectScoreByScoId(resId);
        model.addAttribute("res", score);
        model.addAttribute("resId", resId);
        return "tea/updateResultByid";
    }

    /**
     * @Description 更新成绩信息操作（根据学生 ID 查询）。
     * @param score 需要更新的成绩 Resultss 对象
     * @param bindingResult 绑定结果
     * @param model Model 对象
     * @return 更新成功重定向到根据学生 ID 查询的成绩页面，失败返回成绩修改页面
     **/
    @PutMapping(value = "/tea/resbyid")
    public String updateResById(@Valid Score score, BindingResult bindingResult, Model model) {
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        List<MyError> errmsg = new ArrayList<>();
        if (allErrors.size() == 0) {
            scoreService.deleteScoreById(score.getScoId());
            scoreService.addScore(score);
            return "redirect:/tea/selectById/1?stuId=" + score.getStuId();
        } else {
            for (ObjectError error : allErrors) {
                errmsg.add(new MyError(error.getDefaultMessage()));
            }
            model.addAttribute("errors", errmsg);
            model.addAttribute("res", score);
            return "tea/updateResultByid";
        }
    }

    /**
     * @Description 处理删除成绩信息事务（根据学生 ID 查询）。
     * @param resId 成绩 ID
     * @return 重定向到根据学生 ID 查询的成绩页面
     **/
    @DeleteMapping(value = "/tea/resbyid/{resId}")
    public String deleresById(@PathVariable("resId") int resId) {
        Score score = scoreService.selectScoreByScoId(resId);
        scoreService.deleteScoreById(resId);
        return "redirect:/tea/selectById/1?stuId=" + score.getStuId();
    }

    /**
     * @Description 返回查询学生排名页面。
     * @return 查询学生排名页面
     **/
    @GetMapping(value = "/tea/torank")
    public String torankpage() {
        return "tea/rank";
    }

    /**
     * @Description 处理查询学生排名事务。
     * @param resTerm 学期
     * @param model Model 对象
     * @return 学生排名列表页面
     **/
    @GetMapping(value = "/tea/selectRank")
    public String selectRank(@Param("resTerm") String resTerm, Model model) {
        List<Rank> ranks = scoreService.selectRankByTerm(resTerm);
        model.addAttribute("ranks", ranks);
        model.addAttribute("resTerm", resTerm);
        return "tea/ranklist";
    }

    /**
     * @Description 返回根据班级查询学生排名页面。
     * @param model Model 对象
     * @return 根据班级查询学生排名页面
     **/
    @GetMapping(value = "/tea/torankbyclass")
    public String torankbyclasspage(Model model) {
        return "tea/rankbyclass";
    }

    /**
     * @Description 处理根据班级查询学生排名事务。
     * @param resTerm 学期
     * @param className 班级名称
     * @param model Model 对象
     * @return 学生排名列表页面
     **/
    @GetMapping(value = "/tea/selectRankbyclass")
    public String selectRankbyclass(@Param("resTerm") String resTerm, @Param("className") String className, Model model) {
        List<MyError> errmsg = new ArrayList<>();
        if (resTerm.equals("") || className.equals("")) {
            errmsg.add(new MyError("请输入学期信息以及班级信息"));
            model.addAttribute("errors", errmsg);
            return "tea/rankbyclass";
        } else {
            List<Rank> ranks = scoreService.selectRankByTermAndStuClass(resTerm, className);
            model.addAttribute("ranks", ranks);
            model.addAttribute("resTerm", resTerm);
            model.addAttribute("className", className);
            return "tea/ranklistbyclass";
        }
    }
}
